﻿/**
 *
 * @file FITKAFLRSurfaceMeshModel.h
 * @brief  面网格数据结构类
 * @author WangKai (aurora_starry@outlook.com)
 *
 */
#ifndef __FITK_AFLR_SURFACE_MESH_MODEL_H___
#define __FITK_AFLR_SURFACE_MESH_MODEL_H___

#include "FITK_Interface/FITKInterfaceMeshGen/FITKAbstractMeshSizeInfoGenerator.h"
#include "FITKMeshGenAFLRAPI.h"
namespace AFLR
{
	/**
	 * @brief  面加密类型
	 * @author WangKai (aurora_starry@outlook.com)
	 */
	enum EncryptType
	{
		EdgeEncryption,
		SurfaceEncryption,
		AllEncryption
	};

	/**
	 * @brief  BL网格类型
	 * @author WangKai (aurora_starry@outlook.com)
	 */
	enum class BLGridType {
		Basic,        // 基础网格
		Prisms,       // 包含棱柱的网格
		SplitHex,     // 包含分割六面体的网格
		FullHex       // 完整六面体网格
	};

	/**
	 * @brief  局部面加密参数
	 * @author WangKai (aurora_starry@outlook.com)
	 */
	struct LocalRefinement
	{
		bool isCheck{ false };
		int geoIndex{ -1 };//几何索引
		int faceGroup{ -1 };//面组存储
		EncryptType encryptType{ SurfaceEncryption };
		double EncryptionFactor;
	};
	/**
     * @brief 网格数据结构类
     * @author WangKai (aurora_starry@outlook.com)
     */
    class FITKMeshGenAFLRAPI FITKAFLRSurfaceMeshModel : public Interface::FITKGlobalMeshSizeInfo
    {
        
    public:

		explicit FITKAFLRSurfaceMeshModel() = default;

		virtual ~FITKAFLRSurfaceMeshModel() = default;

		/**
		 * @brief 获取全局引用长度
		 * @return double
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		double getGlobalSize() const;

		/**
		 * @brief 获取远场表面面组所对应的模型ID
		 * @return  int
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		int getGeoIndexFarFidldId() const;

		/**
		 * @brief 获取远场表面面组ID
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		int getFarfieldId() const;

		/**
		 * @brief 获取远场表面加密系数
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		double getFarfieldRefinementFactor() const;

		/**
		 * @brief 获取局部加密参数
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		QVector<LocalRefinement> getTableWidgetValue() const;

		/**
		 * @brief 获取是否生成边界层
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		bool getGenerateBL() const;

		/**
		 * @brief 获取BL网格生成类型
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-04
		 */
		BLGridType getBLGridType();

		/**
		 * @brief 获取第一层边界层长度
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		double getFirstLayerThickness() const;

		/**
		 * @brief 获取边界层几何增长率
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		double getGeometricGrowthRate() const;

		/**
		 * @brief 获取边界层厚度
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		double getBLThickness() const;

		/**
		 * @brief 获取边界层厚度
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		double getLayers() const;

		/**
		 * @brief 获取边界层表面面组ID所对应模型ID
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		int getGeoIndexBoundaryLayerFaces() const;

		/**
		 * @brief 获取边界层表面面组ID
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		int getBoundaryLayerFaces() const;

		/**
		 * @brief 获取与边界层相交的固体表面面组ID
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		int getGeoIndexIntersectingFaces() const;

		/**
		 * @brief 获取与边界层相交的固体表面面组ID所对应的模型ID
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		int getIntersectingFaces() const;

		/**
		 * @brief 全局引用长度
		 * @params size
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		void setGlobalSize(const double &size);
		/**
		 * @brief 远场表面面组所对应的模型ID
		 * @params id
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		void setGeoIndexFarFidldId(const int &id);

		/**
		 * @brief 设置远场表面ID
		 * @params id
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-08-28
		 */
		void setFarfieldId(const int &id);

		/**
		 * @brief 设置远场表面加密系数
		 * @params factor
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setFarfieldRefinementFactor(const double &factor);
		/**
		 * @brief 设置表格控件参数
		 * @params value
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setTableWidgetValue(const QVector<LocalRefinement> &value);

		/**
		 * @brief 设置是否生成边界层
		 * @params generate
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setGenerateBL(const bool &generate);

		/**
		 * @brief 设置BL网格生成类型
		 * @params type
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-04
		 */
		void setBLGridType(BLGridType type);

		/**
		 * @brief 设置第一层边界层厚度
		 * @params thickness
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setFirstLayerThickness(const double &thickness);
		
		/**
		 * @brief 设置几何增长率
		 * @params rate
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setGeometricGrowthRate(const double &rate);
		
		/**
		 * @brief 设置边界层厚度
		 * @params thickness
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setBLThickness(const double &thickness);
		
		/**
		 * @brief 设置边界层最大层数
		 * @params layers
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setLayers(const double &layers);
		
		/**
		 * @brief 设置生成与边界层相交的模型ID
		 * @params faces
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setGeoIndexBoundaryLayerFaces(const int &faces);
		
		/**
		 * @brief 设置生成边界层的面组ID
		 * @params faces
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setBoundaryLayerFaces(const int &faces);
		
		/**
		 * @brief 设置与边界层相交的模型ID
		 * @params faces
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setGeoIndexIntersectingFaces(const int &faces);
		
		/**
		 * @brief 设置与边界层相交的面组ID
		 * @params faces
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setIntersectingFaces(const int &faces);

		/**
		 * @brief 设置当前远场表面ComboBox控件的索引
		 * @params value
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setCurrentFarfieldIdComboBoxIndex(const int &value);

		/**
		 * @brief 获取当前远场表面ComboBox控件的索引
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		int getCurrentFarfieldIdComboBoxIndex() const;

		/**
		 * @brief 获取当前边界层表面ComboBox控件的索引
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		int getCurrentBoundaryLayerFacesComboBoxIndex() const;

		/**
		 * @brief 设置当前边界层表面ComboBox控件的索引
		 * @params index
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setCurrentBoundaryLayerFacesComboBoxIndex(const int& index);

		/**
		 * @brief 获取当前与边界层相交的面的ComboBOx控件的索引
		 * @return  
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		int getCurrentIntersectingFacesComboBoxIndex() const;
		
		/**
		 * @brief 设置当前与边界层相交的面的ComboBox控件的索引
		 * @params index
		 * @author WangKai (aurora_starry@outlook.com)
		 * @date 2024-09-07
		 */
		void setCurrentIntersectingFacesComboBoxIndex(const int& index);

		QHash<QString , int> getDataComboBoxIndexHash() const;
		void setDataComboBoxIndexHash(const QHash<QString , int>& hash);

		QHash<QString , QString> getDataLineEditHash() const;
		void setDataLineEditHash(const QHash<QString , QString>& hash);

		QHash<QString , bool> getDataCheckBoxHash() const;
		void setDataCheckBoxHash(const QHash<QString , bool>& hash);

    protected:
    private:
		double _globalSize{ 0 };
		int _geoIndexFarFidldId{ -1 };
		int _farfieldId{ -1 };
		double _farfieldRefinementFactor{ 1.3 };
		QVector<LocalRefinement> _tableWidgetValue{};
		
		bool _generateBL{ false };

		BLGridType _gridType{ BLGridType::Prisms };
		double _firstLayerThickness{ 0 };
		double _geometricGrowthRate{ 0 };
		double _blThickness{ 0 };
		double _layers{ 0 };
		int _geoIndexBoundaryLayerFaces{ -1 };
		int _boundaryLayerFaces{ -1 };
		int _geoIndexIntersectingFaces{ -1 };
		int _intersectingFaces{ -1 };

		QStringList _farfieldIdList;
		QStringList _edgeList;
		QStringList _edgeEncryptionFactorList;
		QStringList _faceList;
		QStringList _faceEncryptionFactorList;
		QStringList _boundaryLayerFacesList;
		QStringList _intersectingFacesList;
		//用于存储当前界面的comboBox的索引
		int _currentFarfieldIdComboBoxIndex{ -1 };
		int _currentBoundaryLayerFacesComboBoxIndex{ -1 };
		int _currentIntersectingFacesComboBoxIndex{ -1 };

		//实现面组名字跟加密方式一一对应
		QHash<QString , int> _dataComboBoxIndexHash;
		//实现面组名字跟加密系数一一对应
		QHash<QString , QString> _dataLineEditHash;
		//实现面组名字跟勾选框一一对应
		QHash<QString , bool> _dataCheckBoxHash;
    };
}


#endif
